/**
 * @author Zhl
 * @version v0.0.1
 * @createTime 2024年3月5日
 * @description 在开发过程中,感知痛点,一些比较常用的小方法,可以帮助自己更好的进行程序的开发,同时也可以增进自己对于代码流程的理解,拓宽自己的知识层面.仅此而已.
 */

import { sortAscend } from "./arrayActionFn";

/**
 * @description 该方法用来检测数据类型
 * @param {*} v 需要检验数据类型的数据
 * @return {String} 返回数据类型字符串  undefined\string\number\NaN\function\object\array\null\boolean\symbol
 */
export const typeCheck = function (v) {
  let t = typeof v;
  if (t === "object") {
    if (v instanceof Array) {
      return "array";
    } else if (v instanceof Object) {
      return "object";
    } else {
      return "null";
    }
  } else {
    //undefined\string\number(包含nan)\function
    if (v !== v) {
      //利用NaN 不等于NaN 的原理
      return "NaN";
    } else {
      return t;
    }
  }
};

/**
 * @description 检验数字
 */

/**
 * @description 数组升序,主要对纯数字数组以及包含统一属性为数字的对象组成的数组的排序
 */
export const ascendingChain = function (v) {
  //是否数组
  if (typeCheck(v) !== "array") return v;
  if (v.length === 0) return v;
  //对数组中的每一项进行验证
  if (typeCheck(v[0]) === "object") {
    //如果第一项为对象,则都为对象
    let r = v.filter((i, d) => {
      return typeCheck(i) !== "object";
    });
    //不符规则,返回原值
    if (r && r.length > 0) return v;
  } else if (typeCheck(v[0]) === "number") {
    let r = v.filter((i, d) => {
      return typeCheck(i) !== "number";
    });
    //不符规则,返回原值
    // debugger;
    if (r && r.length > 0) return v;
    return sortAscend(v);
  } else {
    //不符规则,返回原值
    return v;
  }
};
//-------------基础类型判断，来自vue源码--------------------
/**
 * 判断是否为undefined或null
 */
export const isUndefOrNull = function (p) {
  return p === undefined || p === null;
};

/* 判断是否为基本类型 */
export const isBaseType = function (p) {
  return (
    typeof p ==='string'||
    typeof p ==='number'||
    typeof p ==='boolean'||
    typeof p ==='symbol'
  )
}
// 判断是否是对象
export const isObject =  function  (obj) {
  return obj !== null && typeof obj === 'object'
}

// 获取数据类型的字符串
var _toString = Object.prototype.toString;

export const toGetType =  function  (value) {
  return _toString.call(value).slice(8, -1)
}
// 判断是否是现象
function isPlainObject (obj) {
  return _toString.call(obj) === '[object Object]'
}

